#ifndef __J_TYPE_H_
#define __J_TYPE_H_
#include <sys/types.h>
#include <stdint.h>

#define MAKE_FORCC(ch0, ch1, ch2, ch3) 	((ch0 & 0xFF) | ((ch1 & 0xFF) << 8) | ((ch2 & 0xFF) << 16) | ((ch3 & 0xFF) << 24))

///NVR 云台控制命令
#define 		JO_PTZ_UP				1	//向上旋转
#define 		JO_PTZ_DOWN				2	//向下旋转
#define 		JO_PTZ_LEFT				3	//向左旋转
#define 		JO_PTZ_RIGHT			4	//向右旋转
#define 		JO_PTZ_UP_LEFT			5	//左上旋转
#define 		JO_PTZ_UP_RIGHT		6	//右上旋转
#define 		JO_PTZ_DOWN_LEFT		7	//左下旋转
#define 		JO_PTZ_DOWN_RIGHT		8	//右下旋转

#define 		JO_PTZ_PRE_SET			9	//设置预置点
#define 		JO_PTZ_PRE_CLR			10	//清除预置点
#define		JO_PTZ_GOTO_PRE		11	//转至预置点

#define		JO_PTZ_ZOOM_IN			12	//倍率变大
#define		JO_PTZ_ZOOM_OUT		13	//倍率变小
#define		JO_PTZ_FOCUS_NEAR		14	//焦点调近
#define		JO_PTZ_FOCUS_FAR		15	//焦点调远
#define 		JO_PTZ_IRIS_OPEN		16	//光圈变大
#define		JO_PTZ_IRIS_CLOSE		17	//光圈变小

///NVR IO类型
enum J_IOType
{
	J_IoRead = 1,		//读标识
	J_IoWrite			//写标识
};

///NVR 告警类型
enum J_AlarmType
{
	J_VideoLost = 1,	//视频丢失
	J_VideoMotdet,		//移动侦测
	J_VideoHide			//视频遮挡
};

///NVR命令集合
enum J_CommandType
{
	J_START_REAL = 1,		//启动实时视频
	J_STOP_REAL,				//关闭实时视频
	J_START_VOD,				//播放录像文件
	J_STOP_VOD,				//停止播放
	J_PAUSE_VOD,				//暂停
	J_SETRTIME_VOD,			//设置播放时间
	J_SETPOS_VOD,			//设置播放位置
	J_SETSCALE_VOD,			//设置播放速度
	J_START_VOICE,			//启动对讲
	J_STOP_VOICE				//关闭对讲
};

///帧类型
enum J_MediaType
{
	J_MediaUnknow = 1,			//未知类型
	J_MediaHead,					//视频头信息
	J_VideoIFrame,					//关键帧
	J_VideoPFrame,					//视频帧
	J_AudioFrame					//音频帧
};

///帧头结构
struct J_StreamHeader
{
	uint32_t dataLen;			//数据长度
	uint32_t frameType;			//帧类型
	uint64_t timeStamp;			//时间戳
	uint32_t frameNum;
	//char data[1];				//帧数据
};

///NVR命令头结构
struct J_CmdHeader
{
	uint32_t cmd;
	uint32_t type;
	union
	{
		int8_t resid[16];
		int8_t fileid[16];
	};
};

///NVR命令回复结构
struct J_RetHeader
{
	uint32_t type;					//设备类型  1-hik
	uint32_t retCode;				//0-sucess; <0-error
};

///NVR存储文件的帧头
struct J_FrameHeader
{
	uint32_t frameType;		//见MediaType
	uint32_t length;			//帧数据长度
	uint32_t offset;			//相对于文件的偏移
	uint64_t timeStamp;		//相对时间戳
};

///NVR存储文件的文件格式
struct J_FileHeader
{
	int8_t type[4];				//数据类型, body-音视频数据, head-头数据，存放一系列NVRFrameHeader
	uint32_t length;			//数据长度,不包含NVRFileHeader
};

///文件信息
struct J_FileInfo
{
	int8_t sFileName[32];				/* 文件名 */
	time_t tStartTime;				/* 文件的开始时间 */
	time_t tStoptime;					/* 文件的结束时间 */
	uint32_t ulFileSize;		/* 文件的大小 */
	int8_t sCardNum[32];				/*卡号信息*/
	uint8_t byLocked;			/*1 表示文件已经被锁定，0表示正常的文件*/
	uint8_t buRes[3];			/*保留*/
};

///设备状态枚举
enum J_DevStatus
{
	J_DevReady = 1,
	J_DevBroken
};

///协议状态
#define J_ProUnReady			0
#define J_ProParamOk			(1 << 0)
#define J_ProConnOk			(1 << 1)
#define J_ProDataUnReady	(1 << 2)
#define J_ProPlaying			(1 << 3)
#define J_ProPaused			(1 << 4)

///媒体上下文信息
struct J_MediaContext
{
	uint32_t forcc;			//媒体类型
	uint32_t len;				//接下来的数据长度
	uint16_t num;				//流数量
	int8_t data[1];				//扩展数据长度
};

///媒体上下文数据
struct J_ContextData
{
	uint32_t forcc;			//媒体类型
	uint32_t len;				//接下来的数据长度
	struct
	{
		int32_t len;
		int8_t data[256];
	} cxt;
};

///前端设备信息结构
struct J_DeviceInfo
{
	int devId;					//设备ID
	char devIp[16];			//设备IP地址
	short devPort;				//设备端口
	char devType[16];			//设备类型
	char userName[16];		//用户名
	char passWd[32];			//密码
	int devStatus;				//设备状态
};

///通道信息结构
struct J_ChannelInfo
{
	char  devId;					//所属设备ID
	int32_t channelNum;			//通道编号
};

///录像信息结构
struct J_RecordInfo
{
	char vodPath[256];				//录像路径
	uint32_t fileSize;				//文件大小
	uint32_t timeInterval;			//录像文件间隔  单位(毫秒)
	uint32_t preRecordTime;			//预录时间 单位(秒)
};

///解析数据类型
enum
{
	J_VideoNormal = 0,
	J_VideoYuyv,
	J_VideoMjpeg
};

///通道ID类型
class J_ChannelKey
{
public:
	int stream_type;
	std::string resid;

	bool operator<(const J_ChannelKey &other) const
	{
		bool b_ret = true;
		if (resid != other.resid)
			b_ret = resid < other.resid;
		else
			b_ret = stream_type < other.stream_type;

		return b_ret;
	}
};

#define MAX_ASIOSIZE 1024

#endif //~__J_TYPE_H_
